package com.test.daily.leetcode.y2021.m12.day1209;

/**
 * @descriptions: validTicTacToe
 * @author: Tom
 * @date: 2021/12/9 下午 04:52
 * @version: 1.0
 */
public class Code01_ValidTicTacToe {
    /**
     * 玩家轮流将字符放入空位（' '）中。
     * 玩家 1 总是放字符 'X' ，而玩家 2 总是放字符 'O' 。
     * 'X' 和 'O' 只允许放置在空位中，不允许对已放有字符的位置进行填充。
     * 当有 3 个相同（且非空）的字符填充任何行、列或对角线时，游戏结束。
     * 当所有位置非空时，也算为游戏结束。
     * 如果游戏结束，玩家不允许再放置字符。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/valid-tic-tac-toe-state
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     */

    public static void main(String[] args) {
        Code01_ValidTicTacToe cv = new Code01_ValidTicTacToe();
        String[] board = new String[]{"XOX","O O","XOX"};
        System.out.println(cv.validTicTacToe(board));
    }
    public boolean validTicTacToe(String[] board) {
        int oCount = 0;
        int xCount = 0;
        for(int i = 0; i < board.length; i++){
            for(int j = 0; j < 3; j++){
                oCount = board[i].charAt(j) == 'O' ? oCount + 1: oCount;
                xCount = board[i].charAt(j) == 'X' ? xCount + 1: xCount;
            }
        }
        if(oCount != xCount && oCount != xCount - 1){
            return false;
        }
        if(isWin(board, 'X') && oCount != xCount - 1){
            return false;
        }
        if(isWin(board, 'O') && oCount != xCount){
            return false;
        }
        return true;
    }

    public boolean isWin(String[] board, char ch){
        for(int i = 0; i < 3; i++){
            if(ch == board[i].charAt(0) && ch == board[i].charAt(1)
                    && ch == board[i].charAt(2)){
                return true;
            }
            if(ch == board[0].charAt(i)
               && ch == board[1].charAt(i) && ch == board[2].charAt(i)){
                return true;
            }
        }
        if(ch == board[0].charAt(0) && ch == board[1].charAt(1)
                && ch == board[2].charAt(2) && ch == board[2].charAt(2)){
            return true;
        }
        if(ch == board[2].charAt(0) && ch == board[1].charAt(1) && ch == board[0].charAt(2)){
            return true;
        }
        return false;
    }
}
